Vyhledavani podle casti retezce II

Otázka od: Lada

15. 8. 2004 16:52

Zdravim vsechny a opet prosim o pomoc...

Vyhledavam v tabulce ve vice fieldech najednou podle casti retezce
zadaneho v Editu..
Bez problemu mne to funguje pokud jsou hledane polozky v polich typu string.
Ted bych ale potreboval vyhledavat soucasne podle casti retezce onoho
editu jak cisla (integer) tak retezce...

Tento kod bohuzel konci chybou pri zadani znaku s diakritikou v
libovolne casti retezce.. bez diakritiky to beha normalne,
vcetne hledani ciselnych polozek...

  IBQuery1.SQL.Add('Select * from Tabulka');

  IBQuery1.SQL.Add('Where Cislo LIKE :p1 '+
                   'or (UPPER(Jmeno COLLATE PXW_CSY) LIKE :p2) '+
                   
'or (UPPER(Prijmeni COLLATE PXW_CSY) LIKE :p3) order
by CISLO');

  IBQuery1.ParamByName('p1').AsString := editHledej.Text;
  IBQuery1.ParamByName('p2').AsString :=
'%'+AnsiUpperCase(editHledej.Text)+ '%';
  IBQuery1.ParamByName('p3').AsString :=
'%'+AnsiUpperCase(editHledej.Text)+ '%';

Tedy nechci se ztrapnovat vic, nez je nutny.. ale myslim si, ze by to
chtelo zkonvertovat 'Cislo' na retezec pomoci fce CAST...?
Jestli je to tak, poradi prosim nekdo jak to v tom mem prikladu provedu...?

FB1.5, D6

Dekuju moc za kazdou radu.

Lada




Odpovedá: Pavel GRATZER

15. 8. 2004 17:56

od: "Lada" <lada.xt@volny.cz>
> Zdravim vsechny a opet prosim o pomoc...
>
> Vyhledavam v tabulce ve vice fieldech najednou podle casti retezce
> zadaneho v Editu..
> Bez problemu mne to funguje pokud jsou hledane polozky v polich typu
string.
> Ted bych ale potreboval vyhledavat soucasne podle casti retezce onoho
> editu jak cisla (integer) tak retezce...
>
> Tento kod bohuzel konci chybou pri zadani znaku s diakritikou v
> libovolne casti retezce.. bez diakritiky to beha normalne,
> vcetne hledani ciselnych polozek...
>
> IBQuery1.SQL.Add('Select * from Tabulka');
>
> IBQuery1.SQL.Add('Where Cislo LIKE :p1 '+
> 'or (UPPER(Jmeno COLLATE PXW_CSY) LIKE :p2) '+
>
'or (UPPER(Prijmeni COLLATE PXW_CSY) LIKE :p3) order
> by CISLO');
>
> IBQuery1.ParamByName('p1').AsString := editHledej.Text;
> IBQuery1.ParamByName('p2').AsString :=
> '%'+AnsiUpperCase(editHledej.Text)+ '%';
> IBQuery1.ParamByName('p3').AsString :=
> '%'+AnsiUpperCase(editHledej.Text)+ '%';
>
> Tedy nechci se ztrapnovat vic, nez je nutny.. ale myslim si, ze by to
> chtelo zkonvertovat 'Cislo' na retezec pomoci fce CAST...?
> Jestli je to tak, poradi prosim nekdo jak to v tom mem prikladu
provedu...?
>
> FB1.5, D6
>
> Dekuju moc za kazdou radu.
>
> Lada
>

A co takhle :

 IBQuery1.SQL.Add('Select * from Tabulka');

 IBQuery1.SQL.Add('Where (Cast(Cislo as Char(30)) like :p1)'
                                  
'or (UPPER(Jmeno COLLATE PXW_CSY) LIKE
:p2) '+
                                  
'or (UPPER(Prijmeni COLLATE PXW_CSY) LIKE
:p3) order by CISLO');

   IBQuery1.ParamByName('p1').AsString := '%'+editHledej.Text+ '%';
   IBQuery1.ParamByName('p2').AsString :=
'%'+AnsiUpperCase(editHledej.Text)+ '%';
   IBQuery1.ParamByName('p3').AsString :=
'%'+AnsiUpperCase(editHledej.Text)+ '%';

Ja to pouzivam v aplikacich a funguje to (neni to s IB, ale SQL by melo byt
standart).

Pavel GRATZER
pavelg@stbk.mcs.cz